home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 569 / dump / dump.s < prev    next >
Text File  |  1991-10-19  |  13KB  |  471 lines

  1. * Hexadecimal dump program by Silas Warner, MicroProse Software
  2. **********************************************
  3. *** Watch for SILENT SERVICE, coming soon! ***
  4. **********************************************
  5. *Appreciation to Jez San, who set me on the right track.
  6. *To assemble the program:
  7. *     AS68 DUMP
  8. *     LINK68 DUMP.O
  9. *     RELMOD DUMP.68K DUMP.TOS
  10. *Then remove DUMP.O and DUMP.68K
  11. *
  12. *APSTART chunk to set stack and memory
  13. start  move.l sp,a5
  14.   move.l #ustk,sp 
  15.   move.l 4(a5),a5
  16.   move.l $c(a5),d0
  17.   add.l $14(a5),d0
  18.   add.l $1c(a5),d0
  19.   add.l #$100,d0
  20.   move.l d0,-(sp) *set up m-f call
  21.   move.l a5,-(sp)
  22.   move.w #0,-(sp)
  23.   move.w #$4a,-(sp)
  24.   trap #1    *do m-f call
  25.   addq.l #4,sp
  26.   move.l (sp)+,a5    *recover basepage
  27.   addq.l #4,sp
  28.   lea.l $80(a5),a1  *command string
  29.   move.l $2c(a5),a2  *env string
  30. *NOW THE PROGRAM STARTS
  31.   lea.l start(pc),a5  *set PBR
  32.    lea.l ustk(a5),sp  *use our own stack
  33.   bra.s startup    *go do the program
  34. *File comment header
  35.   dc.b 13,10,10
  36.   dc.b "Hexadecimal File Dump"
  37.   dc.b 13,10
  38.   dc.b "by Silas Warner."
  39.   dc.b 13,10,10
  40.   dc.b 0
  41.   even
  42. *Okay, do init stuff
  43. startup  lea commstr(a5),a0  *to command string buffer
  44.   clr.w d1
  45. xfercom  move.b (a1)+,d0    *move command string
  46.   move.b d0,(a0)+
  47.   beq xferof
  48.   addq.l #1,d1    *count characters
  49.   cmp.b #78,d1    *up to 78
  50.   bcs xfercom
  51. xferof  move.b #0,(a0)    *zg
  52.   tst.w commstr(a5)  *is command string zero?
  53.   bne commgo    *no, use it
  54.   lea.l commes(a5),a0  *ask for command string
  55.   bsr wstring
  56. commgo  lea.l commstr(a5),a6  *start command parsing
  57.   move.l a6,wrdstor(a5)
  58. parse  move.l wrdstor(a5),a6  *parse next word
  59.   lea.l word(a5),a0
  60. skspc  move.b (a6)+,d0    *skip over multiple blanks
  61.   beq eline    *if zero byte, end parsing
  62.   cmp.b #" ",d0    *is byte a space?
  63.   beq skspc
  64.   bra fstchr    *no, it's 1st byte of command
  65. nxtchr  move.b (a6)+,d0    *get next byte from line
  66. fstchr  move.b d0,(a0)+    *and put it in command word
  67.   beq elparse    *if zero byte, EOL
  68.   cmp.b #" ",d0    *is it a space?
  69.   beq eparse    *Yes, end command
  70.   bra nxtchr    *no, get next byte
  71. elparse  subq.l #1,a6    *parser hit end of line
  72. eparse  move.l a6,wrdstor(a5)  *store pars pointer back
  73.   clr.b -(a0)    *clear off added space
  74.   tst.b word+1(a5)  *next word now stored in word
  75.   bne mbefile    *1-byte files not allowed
  76.   move.b word(a5),d1  *check 1st char
  77.   and.l #$1f,d1
  78.   cmp.b #$13,d1    *is it an S?
  79.   beq toscren
  80.   cmp.b #$10,d1    *is it a P?
  81.   beq toprter
  82.   cmp.b #$17,d1    *is it a W?
  83.   beq kwait
  84.   bra parse    *No, ignore it
  85.  
  86. *end of command line
  87. eline  tst.b printfg(a5)  *are we printing?
  88.   bne exitprog    *yes, don't wait
  89.   bsr wait
  90. exitprog
  91.   move.w #0,-(sp)  *call GEMDOS
  92.   clr.l d0
  93.   trap #1    *that's it! we gone!
  94.  
  95. *wait by order of command line
  96. kwait  bsr wait
  97.   bra parse
  98.  
  99. *set dump to screen
  100. toscren  clr.w printfg(a5)
  101.   lea.l scnmes(a5),a0  *tell the world
  102.   bsr wstring  *printing to screen
  103.   bra parse
  104.  
  105. *set dump to printer
  106. toprter  move.w #$11,-(sp)
  107.   trap #1    *is printer ready?
  108.   addq.l #2,sp
  109.   tst.b d0
  110.   bne prtcan
  111.   clr.w printfg(a5)  *printer not ready!
  112.   lea.l pnrmes(a5),a0  *tell them so
  113.   bsr wstring
  114.   bra parse
  115. prtcan  st.b printfg(a5)  *printer on!
  116.   clr.w stopfg(a5)  *normally no STOP during print!
  117.   lea.l prtmes(a5),a0  *tell the world
  118.   bsr wstring  *dumping to printer
  119.   bra parse
  120.  
  121. *load and dump a file
  122. mbefile  clr.w killfg(a5)  *set up for CTRL-C
  123.   lea.l filmes(a5),a0  *print file name
  124.   bsr ostring
  125.   lea.l word(a5),a0
  126.   bsr ostring
  127.   lea.l word(a5),a0
  128.   bsr openrd    *try to open the file
  129.   bpl opengod    *did it work?
  130.   lea.l nfdmes(a5),a0  *no, tell us so
  131.   bsr ostring
  132.   bra parse
  133. opengod  move.w d0,handle(a5)  *Yes, prepare to read file
  134.   bsr newlinp
  135.   clr.l d5    *d5 is dump count
  136. rdachk  lea.l start(pc),a5  *make sure PBR is set
  137.   move.w handle(a5),d1
  138.   move.l #16,d0    *read 16 bytes
  139.   lea.l chacter(a5),a0  *to chacter array
  140.   bsr infile    *do it!
  141.   bmi eofile    *if file error
  142.   move.l d0,d6    *d6 is bytes read
  143.   clr.l d4    *d4 is bytes dumped
  144.   move.l d5,d1    *byte count
  145.   swap d1      *print long address
  146.   bsr hxpword
  147.   swap d1
  148.   bsr hxpword
  149.   bsr dpspace
  150.   bsr dpspace    *2 spaces (column 10)
  151.   move.l #10,d3    *d3 is column count
  152.   lea.l chacter(a5),a4
  153. nxtbhx  move.w 0(a4,d4.w),d1  *get a word
  154.   bsr hxpword    *and print it
  155.   bsr dpspace
  156.   addq.l #2,d4    *inc word count
  157.   addq.l #5,d3    *and column count
  158.   cmp.b d4,d6    *are we past dump ct?
  159.   bhi nxtbhx
  160. colit  bsr dpspace    *space over to colunmn 58
  161.   addq.l #1,d3
  162.   cmp.b #58,d3
  163.   bcs colit
  164.   clr.l d4    *set print ct back to 0
  165. nxtdmp  move.b 0(a4,d4.w),d1  *now get a byte
  166.   cmp.b #$20,d1    *is it a ctl byte?
  167.   bcc palain
  168.   move.b #".",d1
  169. palain  bsr ochar    *and print it
  170.   addq.l #1,d4    *try next byte
  171.   cmp.b d4,d6    *are we past dump ct?
  172.   bhi nxtdmp
  173.   add.l d6,d5
  174.   bsr newlinp
  175.   tst.b killfg(a5)  *was CTRL-C hit?
  176.   bne eofile    *Yes, end file
  177.   cmp.b #16,d6    *was there a short read?
  178.   beq rdachk    *no, next line
  179.  
  180. eofile  lea.l start(pc),a5
  181.   move.w handle(a5),d1  *end of the dump file
  182.   bsr closfil    *so close it
  183.   lea.l dbline(a5),a0  *print an end line
  184.   bsr ostring
  185.   bra parse    *and look at command line again
  186.  
  187. ostring  tst.b printfg(a5)  *print a string
  188.   bne pstring    *to printer?
  189.   bra wstring    *no, to screen
  190. pstring  clr.l d0    *print 1 char
  191.   move.b(a0)+,d0    *at a time
  192.   tst.b d0    *is it zero?
  193.   bne pstrin1    *if not, print it
  194.   rts
  195. pstrin1  movem.l a0-a6/d1-d7,-(sp)
  196.   move.w d0,-(sp)
  197.   move.w #5,-(sp)    *GEMDOS for print char
  198.   trap #1
  199.   addq.l #4,sp
  200.   movem.l (sp)+,a0-a6/d1-d7
  201.   bra pstring
  202.  
  203. *print a hex word to screen or printer
  204. hxpword  move.w d1,-(sp)  *thanks to Jez San
  205.   lsr.w #8,d1
  206.   lsr.w #4,d1
  207.   bsr.s hxpnibbl  *1st nybble
  208.   move.w (sp),d1
  209.   lsr.w #8,d1
  210.   bsr.s hxpnibbl  *2nd nybble
  211.   move.w (sp),d1
  212.   lsr.w #4,d1
  213.   bsr.s hxpnibbl  *3rd nybble
  214.   move.w (sp)+,d1
  215. hxpnibbl
  216.   and.w #15,d1  *finally print out ONE hex digit!
  217.   cmp.b #9,d1
  218.   bls.s hxpnib2
  219.   add.b #7,d1
  220. hxpnib2  add.b #"0",d1
  221. *fall thru to
  222. *print a char to screen or printer
  223. ochar  tst.b printfg(a5)  *sending to printer?
  224.   bne pchar
  225.   bra wrchar    *no, go to screen
  226. pchar  movem.l a0-a6/d0-d7,-(sp)
  227.   move.w d1,-(sp)
  228.   move.w #5,-(sp)    *GEMDOS for print
  229.   trap #1
  230.   addq.l #4,sp
  231.   movem.l (sp)+,a0-a6/d0-d7
  232.   rts
  233.  
  234. *print a space
  235. dpspace  move.b #32,d1
  236.   bra ochar
  237.  
  238. *print a new line and pause if needed
  239. newlinp  move.b #13,d1
  240.   bsr ochar
  241.   move.b #10,d1
  242.   bsr ochar
  243. *normal pause
  244. pause  tst.b stopfg(a5)  *is STOPFG set?
  245.   bne paused
  246.   bsr getchar    *try to get char - NO pause
  247. paskek  cmp #$20,d0    *is it a space?
  248.   beq setpaus
  249.   cmp #$03,d0    *is it CTRL-C?
  250.   beq setkill
  251.   cmp #$0d,d0    *is it RETURN?
  252.   bne pausrts
  253. clrpaus  clr.w stopfg(a5)  *clear STOPFG
  254. pausrts  rts
  255. setpaus  st.b stopfg(a5)    *set STOPFG
  256. paused  lea.l paumes(a5),a0  *print "--More--"
  257.   bsr wstring
  258.   bsr rdchar    *wait for a key
  259.   cmp #$03,d0    *is it CTRL-C?
  260.   beq setkill
  261.   cmp #$0d,d0    *is it RETURN?
  262.   beq clrpaus
  263.   rts
  264. setkill  st.b killfg(a5)    *set KILLFG
  265.   rts
  266.  
  267. *wait for key (commanded or at end)
  268. wait  lea.l watmes(a5),a0  *print "Press a Key"
  269.   bsr wstring
  270.   bsr rdchar    *and wait for a key
  271.   rts
  272.  
  273. *getchar - Get key without echo and without waiting!
  274. *          Exit, d0.b is key, or zero if no key ready
  275. getchar  movem.l a0-a6/d1-d7,-(sp)
  276.   move.w #$0b,-(sp)
  277.   trap #1
  278.   addq.l #2,sp
  279.   tst.l d0  *is there a key?
  280.   bmi.s rdchq
  281.   movem.l (sp)+,a0-a6/d1-d7
  282.   clr.l d0  NO,return zero
  283.   rts
  284.  
  285. *rdchar  - Wait fpr a key (no echo)
  286. *          Exit, d0.b is key
  287. rdchar  movem.l a0-a6/d1-d7,-(sp)
  288. rdchq  move.w #$07,-(sp)
  289.   trap #1    *call DOS which returns 2 bytes
  290.   addq.l #2,sp  *in lower & upper word of d0
  291.   movem.l (sp)+,a0-a6/d1-d7
  292.   tst.w d0  *is lower word zero?
  293.   bne tsttop  *no, return upper word
  294. lswap  swap d0    *get upper if zero
  295. rdora  or.b #$80,d0  *set high bit
  296. rdout  and.l #$ff,d0  *of lower byte only!
  297. rdrts  rts    *and return
  298. tsttop  swap d0    *lower word nonzero
  299.   cmp.w #$44,d0  *if upper out of range
  300.   bcs bswap  *go to swap lower back
  301.   cmp.w #$54,d0  *same if above range
  302.   bls lswap  *if in range lower word or #$80
  303. bswap  swap d0    *if out of range, lower word!
  304.   bra rdout
  305.  
  306. *rstring - Get a string from GEMDOS (input line)
  307. *          Entry, a0 =address of buffer (2 bytes +max length)
  308. *                 d0 =max length
  309. *          Exit, a0 =address of first char in buffer
  310. *                d0 =length of input line
  311. rstring  movem.l a1-a6/d1-d7,-(sp)
  312.   move.w d0,d2
  313. zstring  move.b #0,2(a0,d2.w)
  314.   dbf d2,zstring
  315.   move.l a0,-(sp)
  316.   move.b d0,(a0)
  317.   move.w #$0a,-(sp)
  318.   trap #1    *GEMDOS call
  319.   addq.l #2,sp
  320.   move.l (sp)+,a0
  321.   addq.l #1,a0
  322.   move.b (a0)+,d0
  323.   movem.l (sp)+,a1-a6/d1-d7
  324.   rts
  325.  
  326. *wstring - Print a string to the screen (up to zero byte)
  327. *          Entry, a0 =address of string
  328. wstring  movem.l a1-a6/d0-d7,-(sp)
  329.   move.l a0,-(sp)
  330.   move.w #$09,-(sp)
  331.   trap #1
  332.   addq.l #2,sp
  333.   move.l (sp)+,a0
  334.   movem.l (sp)+,a1-a6/d0-d7
  335.   rts
  336.  
  337. *nspaces - Print d0+1 spaces
  338. *          Entry, d0 =# of spaces to print
  339. *          Exit, d0 = -1
  340. nspaces  move.l d1,-(sp)
  341. nspace1  bsr dospace
  342.   dbf d0,nspace1
  343.   move.l (sp)+,d1
  344.   rts
  345.  
  346. *dospace - Print one space
  347. *          Exit, d1 = #32 (SPACE)
  348. dospace  move.w #32,d1  *and fall thru to
  349.  
  350. *wrchar  - Print a character to the screen
  351. *          Entry, d1 =character to print
  352. wrchar  movem.l d0-d7/a0-a6,-(sp)
  353.   move.w d1,-(sp)
  354.   move.w #2,-(sp)
  355.   trap #1
  356.   addq.l #4,sp
  357.   movem.l (sp)+,d0-d7/a0-a6
  358.   rts
  359.  
  360. *newline - Print a CR and LF
  361. *          Exit, d1 = #10 (LF)
  362. newline  move.w #13,d1
  363.   bsr wrchar
  364.   move.w #10,d1
  365.   bra wrchar
  366.  
  367. *openrd  - open a file for loading or reading
  368. *          Entry, a0 =addr of file to open
  369. *          Exit IF SUCCESFUL (N=0)
  370. *                d0 =file handle
  371. *          Exit IF ERROR (N=1)
  372. *                d0 =error #
  373. openrd  movem.l a1-a6/d1-d7,-(sp)
  374.   move.w #0,-(sp)
  375.   move.l a0,-(sp)
  376.   move.w #$3d,-(sp)
  377.   trap #1
  378.   addq.l #2,sp
  379.   move.l (sp)+,a0
  380.   addq.l #2,sp
  381.   movem.l (sp)+,a1-a6/d1-d7
  382.   tst.l d0
  383.   rts
  384.  
  385. *infile  - read a buffer fron disk
  386. *          Entry,a0.l =address of buffer
  387. *                d0.l =buffer length
  388. *                d1.w =file handle
  389. *          Exit IF SUCCESSFUL (N=0)
  390. *               d0.l =# of bytes read
  391. *          Exit IF ERROR (N=1)
  392. *               d0.l =Error #
  393. infile  movem.l a1-a6/d2-d7,-(sp)
  394.   move.w #$3f,d2
  395.   move.l a0,-(sp)
  396.   move.l d0,-(sp)
  397.   move.w d1,-(sp)
  398.  
  399.  
  400.   move.w d2,-(sp)
  401.   trap #1
  402.   addq.l #2,sp
  403.   move.w (sp)+,d1
  404.   addq.l #4,sp
  405.   move.l (sp)+,a0
  406.   movem.l (sp)+,a1-a6/d2-d7
  407.   tst.l d0
  408.   rts
  409.  
  410. *closfil - close a disk file
  411. *          Entry, d1 =file handle
  412. *          Exit, d0 =error code or 0
  413. closfil  movem.l a0-a6/d2-d7,-(sp)
  414.   move.w d1,-(sp)
  415.   move.w #$3e,-(sp)
  416.   trap #1
  417.   addq.l #2,sp
  418.   move.w (sp)+,d1
  419.   movem.l (sp)+,a0-a6/d2-d7
  420.   tst.l d0
  421.   rts
  422.  
  423. *DATA segment
  424.   .data
  425. wrdstor  dc.l 0
  426. printfg  dc.w 0  *0 if default to screen, 255 if to printer
  427. stopfg  dc.w 0  *0 if default to run on, 255=stop on 1st line
  428. killfg  dc.w 0  *must be 0!
  429. handle  dc.w 0
  430. commes  dc.b 13,"Type commands separated by spaces:",13,10
  431.   dc.b 13,"   Filename ",13,10
  432.   dc.b 13,"   S (to screen)",13,10
  433.   dc.b 13,"   P (to printer)",13,10
  434.   dc.b 13,"   W (Wait)",13,10
  435.   dc.b "Dump Command:"
  436.   dc.b 0
  437. scnmes  dc.b 13,10,"Dumping to screen.",13,10,0
  438. prtmes  dc.b 13,10,"Dumping to printer.",13,10,0
  439. pnrmes  dc.b 13,10,"Printer not ready!",13,10,0
  440. paumes  dc.b 13,"--More--",13,0
  441. watmes  dc.b 13,10,"--Press a key--",13,0
  442. filmes  dc.b 13,10,10,"File:",0
  443. nfdmes  dc.b " not found.",13,10,0
  444. dbline  dc.b 13,10,10
  445.   dc.b "-------------------------------------------"
  446. dblret  dc.b 13,10,0
  447. title  dc.b 13,"+----------------------------+",13,10
  448.   dc.b 13,"!  Hexadecimal Dump Program  !",13,10
  449.   dc.b 13,"! Silas Warner -- MicroProse !",13,10
  450.   dc.b 13,"!SPACE=pause    RETURN=resume!",13,10
  451.   dc.b 13,"+----------------------------+",13,10
  452.   dc.b 0
  453.   even
  454.  
  455. *BSS segment
  456.   .bss
  457.   even
  458.   ds.l 256 *256 stacks
  459. ustk  ds.l 1
  460. ibuff  ds.b 2  *2 bytes before COMMSTR
  461. commstr  ds.b 80  *command line
  462.   even
  463. chacter  ds.b 20 *40 bytes from file
  464. fname  ds.b 80  *file name
  465.   even
  466. word  ds.b 80 *used in parsing
  467.   even
  468.  
  469. *********************
  470.   end
  471.